﻿#ifndef TCPSOCKET_H                 // 头文件包含保护：避免重复包含引起的重定义
#define TCPSOCKET_H

#include <string>                   // 使用 std::string
#include <vector>                   // 使用 std::vector
#include <thread>                   // 使用 std::thread 进行多线程
#include <mutex>                    // 使用 std::mutex 做线程同步
#include <functional>               // 使用 std::function 存放回调函数
#include <atomic>                   // 使用 std::atomic 原子状态位
#include <algorithm>                // 使用 std::find/remove 等算法

#ifdef _WIN32                       // Windows 平台专有头文件/库
#include <winsock2.h>               // Windows 套接字核心 API
#include <ws2tcpip.h>               // 额外的 TCP/IP 功能（如 inet_pton）
#pragma comment(lib, "ws2_32.lib")  // VS/MSVC 下自动链接 ws2_32 套接字库
#else                               // 非 Windows（如 Linux/macOS）
#include <sys/socket.h>             // 通用套接字 API
#include <arpa/inet.h>              // 字节序/地址转换（inet_pton/ntop、htons 等）
#include <unistd.h>                 // close() 等 POSIX 接口
#endif

class TcpSocket {
public:
    using RecvCallback = std::function<void(int client_fd, const std::vector<char>& data)>; // 定义接收回调类型：参数为客户端 fd 和数据

    TcpSocket();                    // 构造函数：初始化状态、必要资源
    ~TcpSocket();                   // 析构函数：释放资源（关闭线程/套接字等）

    // ---------------- 客户端功能 ----------------
    bool connectServer(const std::string& ip, int port, int timeout_seconds = 5); // 客户端连接到指定 IP:port，支持超时（秒）

    // 客户端发送接口（内部使用 main_fd）
    bool sendData(const std::vector<char>& data);       // 同步发送：阻塞直到系统调用返回
    void sendDataAsync(const std::vector<char>& data);  // 异步发送：通常在内部起线程/任务队列发送

    // ---------------- 服务端功能 ----------------
    bool startServer(int port);       // 启动服务端监听：绑定端口并 listen，创建接受线程
    void stopServer();                // 停止服务端：关闭监听与所有客户端、回收线程

    // 服务端发送（指定客户端 fd）
    bool sendData(int client_fd, const std::vector<char>& data);       // 同步发送给某个客户端
    void sendDataAsync(int client_fd, const std::vector<char>& data);  // 异步发送给某个客户端

    // ---------------- 通用功能 ----------------
    void startAsyncRecv(RecvCallback callback);   // 启动异步接收线程：收到数据后调用回调
    void stopAsyncRecv();                         // 停止异步接收线程
    bool isConnected() const { return connected; } // 查询连接/运行状态（客户端为已连接，服务端可表示已就绪）
    int getSocket() const { return main_fd; }      // 获取主套接字：客户端为连接 fd，服务端为监听 fd

private:
    std::atomic<bool> connected;   // 是否已建立连接/可用（原子位，跨线程安全）
    std::atomic<bool> running;     // 接收/接受循环是否运行中（原子位）

    int main_fd;                   // 客户端：主连接 fd；服务端：监听 fd
    std::vector<int> client_fds;   // 服务端：已接入的客户端 fd 列表
    std::mutex fds_mutex;          // 保护 client_fds 的互斥量
    std::mutex send_mutex;         // 发送操作的互斥量（保证多线程发送时串行化）

    std::thread accept_thread;     // 服务端：accept() 接受连接线程
    std::thread recv_thread;       // 通用/服务端：接收数据线程（或客户端收数据）
    RecvCallback recv_callback;    // 数据到达时的回调（由上层注册）

#ifdef _WIN32
    static bool wsa_initialized;   // WSA 是否已初始化（Windows 专用）
    static void initWSA();         // 初始化 WSA 的静态方法（调用 WSAStartup）
#endif

    void acceptLoop();             // 服务端：循环 accept 新连接，放入 client_fds
    void recvLoop();               // 通用：循环接收数据并分发到回调（客户端或服务端模式）
    void handleClient(int client_fd); // 服务端：处理单一客户端的收发/断开清理
};

#endif // TCPSOCKET_H                // 头文件包含保护的结束
